//
// Created by ASUS on 2024/1/9.
//
#include <bits/stdc++.h>
using namespace std;

class NumTrie{
	NumTrie*children[10];//10个子节点
	int flag;//标记是否存在,以及前缀的个数
	string val;//当前节点的值
public:
	NumTrie(){
		for(int i=0;i<10;i++) children[i]=nullptr;
		flag=false;
		val="";
	}

	void insert(string s){
		int n=s.length();
		NumTrie*p=this,*q;
		for(int i=0;i<n;i++){
			int c=s[i]-'0';
			if(p->children[c]==nullptr){
				q=new NumTrie();
				q->val=p->val+s[i];
				p->children[c]=q;
				p=p->children[c];
			}else{
				p=p->children[c];
				p->flag++;
			}
		}
	}

	int find(string s){
		int n=s.length();
		NumTrie*p=this;
		for(int i=0;i<n;i++){
			int c=s[i]-'0';
			p=p->children[c];
			if(p==nullptr) return 0;
		}
		return p->flag;
	}

	void dfs(vector<int>&ans){
		NumTrie*p=this;
		if(!p) return;
		if(p->flag){
			ans.push_back(stoi(p->val));
			return;
		}
		for(int i = 0; i < 10; i++){
			p -> children[i]->dfs(ans);
		}
	}
};
int main(){
	NumTrie *trie=new NumTrie();
	int n;cin>>n;
	for(int i=1;i<=n;i++){
		trie->insert(to_string(i));
	}
	vector<int> ans;
	trie->dfs(ans);
	for(int x:ans){
		cout<<x<<" ";
	}
	return 0;
}